package cn.itsource.ymcc.service.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import cn.itsource.ymcc.constant.Constants;
import cn.itsource.ymcc.constant.RConst;
import cn.itsource.ymcc.dto.SmsCodeDto;
import cn.itsource.ymcc.result.JsonResult;
import cn.itsource.ymcc.service.VerifycodeService;
import cn.itsource.ymcc.util.AssertUtil;
import cn.itsource.ymcc.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class VerifycodeServiceImpl implements VerifycodeService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public JsonResult imageCode(String imageCodeKey) {
        //1.参数校验
        AssertUtil.isTrue(StringUtils.hasText(imageCodeKey), "图形验证码key不能为空！");

        //2.图形验证码 糊涂工具包
        //定义图形验证码的长、宽、验证码字符数、干扰线宽度
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(RConst.Num.INTEGER_300,
                RConst.Num.INTEGER_100, RConst.Num.INTEGER_4, RConst.Num.INTEGER_4);
        String imageCode = captcha.getCode();

        //3.存储到Redis中 3分钟过期
        redisTemplate.opsForValue().set(imageCodeKey, imageCode, RConst.Num.INT_3, TimeUnit.MINUTES);

        //4.获取base64编码字符串 放入JsonResult的data属性中返回给前端
        String imageBase64 = captcha.getImageBase64();
        return JsonResult.success().setData(imageBase64);
    }

    @Override
    public JsonResult sendSmsCode(SmsCodeDto smsCodeDto) {

        //验证
        String key = smsCodeDto.getKey();
        AssertUtil.isTrue(redisTemplate.hasKey(key), "图形图片验证码已过期！");
        String imgCode = redisTemplate.opsForValue().get(key).toString();
        //equalsIgnoreCase 不区分大小写
        AssertUtil.isTrue(imgCode.equalsIgnoreCase(smsCodeDto.getImageCode()), "输入的图形验证码不正确！");
        //发送短信验证码
        /*
            手机验证码  在1分钟之内 提示操作太快了
                        在3分钟之内 发送同一个验证码
                        超过 重新发送一个验证码
         */
        String newPhoneCode = StrUtils.getRandomString(RConst.Num.INT_6);
        String phoneKey = Constants.SMS_REGISTER + smsCodeDto.getPhone();
        if (redisTemplate.hasKey(phoneKey)) {//判断key是否存在 不在存直接发送新的 存在判断情况
            Long expire = redisTemplate.getExpire(phoneKey);//获取当前key剩余的过期时间 默认是秒
            AssertUtil.isFalse(expire > RConst.Num.LONG_120, "稍后在获取验证码，谢谢配合");
            String oldPhoneCode = redisTemplate.opsForValue().get(phoneKey).toString();
            System.out.println(oldPhoneCode); //手机短信
        } else {
            System.out.println(newPhoneCode);//发送短信验证码
        }
        redisTemplate.opsForValue().set(phoneKey, newPhoneCode,
                RConst.Num.INT_3, TimeUnit.MINUTES);
        return JsonResult.success();
    }
}
